perm filename INTPLY.F4[FOO,MUS] blob sn#007294 filedate 1972-11-04 generic text, type T, neo UTF8
C  ******** INTPLY.F4 ***********
C  THIS PROGRAM GIVES TRAINING IN THE NAMES OF MUSICAL INTERVALS AS WELL AS
C  GIVING DICTATION OF TWO-NOTE INTERVAL EXAMPLES.  TO RESET THE
C  SPECIAL ERROR MESSAGE TYPE 99999<CR>, THEN THE MESSAGE (PRECEDED BY ONE
C  BLANK).  TO EXIT FROM THE PROGRAM TYPE 'X'.  FIVE CHANCES ARE GIVEN FOR
C  EACH QUESTION.  NO ERRORS ARE COUNTED FOR MOST TYPING MISTAKES.
C  TYPE 'R' TO REPEAT SOUND EXAMPLES, 'Z' TO GET ANSWER.
C  DOUBLE SHARPS MAY BE USED WITH C, D, F, G AND A.  DOUBLE FLATS MAY BE
C  USED WITH D, E, G, A AND B.  AUG5, AUG6 AND DIM3 INTERVALS ARE OK.
C  RAN NUM ≥9999 ACTIVATES SINGINGC  ******** INTPLY.F4 ***********
C  THIS PROGRAM GIVES TRAINING IN THE NAMES OF MUSICAL INTERVALS AS WELL AS
C  GIVING DICTATION OF TWO-NOTE INTERVAL EXAMPLES.  TO RESET THE
C  SPECIAL ERROR MESSAGE TYPE 99999<CR>, THEN THE MESSAGE (PRECEDED BY ONE
C  BLANK).  TO EXIT FROM THE PROGRAM TYPE 'X'.  FIVE CHANCES ARE GIVEN FOR
C  EACH QUESTION.  NO ERRORS ARE COUNTED FOR MOST TYPING MISTAKES.
C  TYPE 'R' TO REPEAT SOUND EXAMPLES, 'Z' TO GET ANSWER.
C  DOUBLE SHARPS MAY BE USED WITH C, D, F, G AND A.  DOUBLE FLATS MAY BE
C  USED WITH D, E, G, A AND B.  AUG5, AUG6 AND DIM3 INTERVALS ARE OK.
C  RAN NUM ≥9999 ACTIVATES SINGING PRACTICE MODE.
C**** LOAD WITH  DICTBT.FAI AND BRZ.REL 
C**** ALSO NEEDS 25 SOUND FILES (ON DTA).

	DIMENSION KAC(3),LAC(5),IDIR(2),NT(7),IVL(24),NTX(24),JNT(25)
	1 ,ISS(6),MSGE(6)
	DATA JNT/'C','CS','D','DS','E','F','FS','G','GS','A','AS','B'
	1,'C5','CS5','D5','DS5','E5','F5','FS5','G5'
	1,'GS5','A5','AS5','B5','C6'/,ISS/'CSS','DSS',0,'FSS','GSS'
	1,'ASS'/,MSGE(3)/'WRONG'/
	DATA NT/'C','D','E','F','G','A','B'/,KAC/' ','F ','# '/,IDIR/'DOWN
	1',' UP '/,LAC/'FF','F ','  ','# ','##'/,IVL/'MN2','MN2','MJ2',
	1'MJ2','AU2','MN3','MJ3','MJ3','P4','P4','AU4','DM5','P5','P5',
	1'MN6','MN6','MJ6','DM7','MN7','MN7','MJ7','MJ7','P8','OCT'/
	DATA NTX/'C','DFF','CS','DF','D','EFF','DS','EF','E','FF','F',
	1 'GFF','FS','GF','G','AFF','GS','AF','A','BFF','AS','BF','B','CF'/
	CALL RNDINT
	CNT=0
	TYPE='TYPE '
	TYPE 255
	ACCEPT 202,MODE
	TYPE 205
	ACCEPT 310,LRAN
C   NEXT CHECKS SYS.
	IF(MODE.EQ.'S')TYPE='SING '
	IF(LRAN.EQ.99999)ACCEPT 202,MSGE
C  SPECIAL ERROR MESS. FOR 'EARS' - UP TO 22 CHARACTERS.(LEAVE 1 BLANK)
	IF(MODE.NE.'L')GO TO 51
	TYPE 52
	CALL PLAY(NT(6),J,0,JP)
51	IF(LRAN.GT.9999)LRAN=LRAN/100
C   LIMIT RAN NUM TO <10000.
C  FOR MOST AUG AND DIM INTERVALS, MAKE RAN NUM >499.
C  FOR SIMPLEST QUESTIONS, RAN NUM MUST BE <100.(USES MOSTLY NATURALS)
	XRAN=1.0
	RAN=23.99
	IOK=0
	IERR=0
	DO 50 K=1,LRAN
50	X=RAND(0.0,0.0)		
	IF(MODE.EQ.'L')LRAN=0
C  WHY NEEDED? 'L' DOES NOT WORK RIGHT IF LRAN>499!!!!! (SEE 13300?) 12/29/71
100	N1=RAND(1.0,7.99)
	IF(N1.EQ.NOTE)GO TO 100
C   NOTE WILL NOT REPEAT.
	NOTE=N1
	JP=0
	IF(CNT.NE.7..OR.MODE.EQ.'S')GO TO 104
	TYPE 1400
C   TYPES 'PRAISE'
	CNT=0
104	IF(LRAN.LT.500)GO TO 105
	XRAN=1.0+CNT/2.0
C  AS CNT GOES UP, RAN SELECTION RANGE INCREASES.
	RAN=23.99+CNT
	IF(RAN.GT.28.)XRAN=23.0
105	CNT=CNT+1.
108	I=RAND(XRAN,RAN)
	IF(I.EQ.23.AND.MODE.NE.'L')GO TO 108
C  23 TO 28 MAKE UP FOR  AU2,MN3 CO0.(USES MOSTLY NATURALS)
	XRAN=1.0
	RAN=23.99
	IOK=0
	IERR=0
	DO 50 K=1,LRAN
50	X=RAND(0.0,0.0)		
	IF(MODE.EQ.'L')LRAN=0
C  WHY NEEDED? 'L' DOES NOT WORK RIGHT IF LRAN>499!!!!! (SEE 13300?) 12/29/71
100	N1=RAND(1.0,7.99)
	IF(N1.EQ.NOTE)GO TO 100
C   NOTE WILL NOT REPEAT.
	NOTE=N1
	JP=0
	IF(CNT.NE.7..OR.MODE.EQ.'S')GO TO 104
	TYPE 1400
C   TYPES 'PRAISE'
	CNT=0
104	IF(LRAN.LT.500)GO TO 105
	XRAN=1.0+CNT/2.0
C  AS CNT GOES UP, RAN SELECTION RANGE INCREASES.
	RAN=23.99+CNT
	IF(RAN.GT.28.)XRAN=23.0
105	CNT=CNT+1.
108	I=RAND(XRAN,RAN)
	IF(I.EQ.23.AND.MODE.NE.'L')GO TO 108
C  23 TO 28 MAKE UP FOR  AU2,MN3 COMBI, ETC.
1108	IF(I.LT.24)GO TO 103
	IF(I.GE.27)I=I-10
	IF(I.GE.25)I=I-14
	IF(I.GE.23)I=I-18
103	JAC=RAND(0.0,2.99)
C  JAC PICKS ACCIDENTAL   0=NAT.  1=b  2=#
	IF(JAC.EQ.0)GO TO 102
	IF(LRAN.LT.100)JAC=0
	IF(JAC.EQ.1.AND.(N1.EQ.1.OR.N1.EQ.4))GO TO 103
	IF(JAC.EQ.2.AND.(N1.EQ.3.OR.N1.EQ.7))GO TO 103
C   CHECKS FOR Cb, Fb, E#, B#
102	INTVL=(I+1)/2+1
C   SMALLEST INTERVAL IS 1/2 STEP.
	NAC=3
C  NAC IS ACCID. FOR 2ND NOTE.  SEE LAC (IN DATA) FOR ORDER.
	IF(I.GT.5)GO TO 10
	N2=2
	GO TO 101
10	IF(I.LT.18)GO TO 20
	N2=7
	GO TO 101
20	N2=(I-3)/3+2
101	IF(I.EQ.5.OR.I.EQ.11)NAC=4
	IF(INTVL.EQ.2.OR.I.EQ.6.OR.I.EQ.12.OR.INTVL.EQ.9.OR.INTVL.EQ.11)
	1 NAC=2
	IF(I.EQ.18)NAC=1
	GO TO (1,2,3,4,5,6,7),N1
C   WHICH NAME FOR NOTE 1?
4	IF(N2.EQ.4)NAC=NAC-1
	GO TO 1
7	IF(N2.EQ.5)GO TO 99
3	IF(N2.EQ.2)GO TO 99
6	IF(N2.EQ.6)GO TO 99
2	IF(N2.EQ.3)GO TO 99
5	IF(N2.EQ.7)GO TO 99
C  USES 'REASONABLE' INTERVALS
	GO TO 1
99	NAC=NAC+1
1	N2=N2+N1-1
	IF(N2.GT.7)N2=N2-7
C  KEEP NOTE 2 WITHIN MUSICAL ALPHABET (C→B)
	NAC=NAC-JAC
	IF(JAC.EQ.2)NAC=NAC+3
	JAC=JAC+1
C  WORKS OUT FINAL FORM OF ACCIDENTALS
9	JDIR=RAND(1.0,2.99)
C  JDIR IS DIRECTION OF LEAP (2=UP  1=DOWN]
	IF(JDIR.EQ.2)GO TO 2000
	K=N2
	KA=LAC(NAC)
C  KA=ACCID. OF 2ND NOTE.
	L=N1
	LA=KAC(JAC)
C  LA=ACCID. OF 1ST NOTE.
	GO TO 1000
2000	IF(NAC.EQ.1.OR.NAC.EQ.5)GO TO 9
C   AVOIDS 'FF' AND '##'
	K=N1
	KA=KAC(JAC)
	L=N2
	LA=LAC(NAC)
1000	IF(KA.EQ.'FF'.OR.KA.EQ.'##')GO TO 108
C  TRY AGAIN IF 'FUNNY' NOTE IS PICKED.
	IF(LRAN.GE.500)GO TO 204
	IF(((K.EQ.4.OR.K.EQ.1).AND.KA.EQ.'F').OR.((K.EQ.3.OR.K.EQ.7)
	1.AND.KA.EQ.'#'))GO TO 108
C  AVOIDS FF,CF,E#,B# IN TYPEOUT
	N1=K
	N2=L
204	IQUES=RAND(1.0,4.99)
C  WHICH MODE OF QUESTION?
	INTVL=INTVL-1
	KANS=' '
	ITRY=IERR+4
2104	IF(IQUES.LT.3)GO TO 3000
	IF(MODE.EQ.'L')GO TO 2041
	TYPE 201,TYPE,IVL(I),IDIR(JDIR),NT(K),KA
C	     INTERVAL  DIRECTION  NOTE  ACCIDENTAL
	IF(MODE.EQ.'S')GO TO 3003
	KANS=NT(L)
	JANS=LA
C  KANS AND JANS STORE INFO TO GIVE ANSWER WHEN 5 ERRORS ARE MADE.
203	ACCEPT 202,L1,L2
	IF(L1.EQ.'X')GO TO 106
C  X=EXIT FROM PROGRAM
	IF(L1.EQ.'Z')GO TO 445
	IF(L2.EQ.'S')L2='#'
	IF(L2.EQ.'SS')L2='##'
	IF(L1.NE.NT(L).OR.L2.NE.LA)GO TO 444
C  NOTE NAME(L1) AND ACCID.(L2) CORRECT?
107	IOK=IOK+1
3005	TYPE 301
	GO TO 100
445	IF(JANS.EQ.'OCT')JANS='P8'
	TYPE 304,KANS,JANS
	CNT=CNT-1.
	IF(L1.NE.'Z')TYPE 302
	GO TO 100
3000	IF(MODE.EQ.'L')GO TO 3003
C   TO 3003 IS TEMPORARY
	TYPE 200,NT(K),KA,IDIR(JDIR),NT(L),LA
	IF(MODE.EQ.'S')GO TO 3003
	JANS=IVL(I)
30	ACCEPT 300,L1
	IF(L1.EQ.'X')GO TO 106
	IF(L1.EQ.'Z')GO TO 445
	IF(L1.EQ.JANS)GO TO 107
C  ADD HERE CHECK ON MODE OF ANSWER*******
444	IF(L1.NE.' ')IERR=IERR+1
	IF(ITRY.EQ.IERR)GO TO 445
	LX=RAND(1,5.99)		
	IF(CNT.GT.0)CNT=CNT-1
C   RESETS 'PRAISE' COUNTER
	GO TO (81,82,83,84,85),LX
81	IF(MODE.EQ.'L')GO TO 811
	TYPE 1200
	GO TO 333
811	TYPE 801
	GO TO 333
82	TYPE 800
	GO TO 333
83	TYPE 900
	GO TO 333
84	IF(MODE.EQ.'L')GO TO 841
	TYPE 1300
	GO TO 333
841	TYPE 802
	GO TO 333
85	IF(MODE.EQ.'L')GO TO 851
	TYPE 1100
	GO TO 333
851	TYPE 202,MSGE
333	TYPE 400
	IF(MODE.EQ.'L')GO TO 2014
	IF(IQUES.GT.2)GO TO 203
	GO TO 30
2041	X=13.5
	Y=1.
	IF(JDIR.EQ.1)Y=25.99
C  RANGE IS C4→C5 OR C4→C3 FOR 1ST NOTE.
	K=RAND(X,Y)
	L=K+INTVL
	IF(JDIR.EQ.1)L=K-INTVL
C  UP OR DOWN?
	NTA=JNT(K)
	NTB=JNT(L)
	KQUES=2
	JANS=IVL(INTVL*2)
32	TYPE 702
2014	TYPE 53
	ACCEPT 300,J
	IF(J.EQ.'X')GO TO 106
2045	CALL PLAY(NTA,NTB,IQUES,JP)
	IF(IQUES.NE.4)CALL PLAY(NTB,J,0,JP)
2044	TYPE 54
	ACCEPT 300,L1
	K=0
	IF(L1.EQ.'X')GO TO 106
	IF(L1.EQ.'Z')GO TO 445
	IF(L1.EQ.'ES')L1='F'
	IF(L1.EQ.'BS')L1='C'
	IF(L1.EQ.'R')GO TO 2045
	IF(KQUES.EQ.3)GO TO 3006
	DO 2042 L=1,23
	IF(L1.NE.IVL(L))GO TO 2042
	K=(L+1)/2
	GO TO 2043
2042	CONTINUE
	IF(L1.EQ.'AU5')K=8
	IF(L1.EQ.'AU6')K=10
	IF(L1.EQ.'DM3')K=2 
C  2 STEPS FOR EACH INTERVAL.
2043	IF(K.EQ.INTVL)GO TO 107
	IF(K.EQ.0)GO TO 446
C   WRONG CLASS OF ANSWER?
	GO TO 444
446	TYPE 303
	GO TO 2044
3003	KQUES=3
	N=N1*2-1
	IF(N1.GT.3)N=N-1
	IF(JDIR.EQ.1)N=N+12
	IF(KA.EQ.'#')N=N+1
	IF(KA.EQ.'F')N=N-1
	NTA=JNT(N)
	J=N+INTVL
	IF(JDIR.EQ.1)J=N-INTVL
	NTB=JNT(J)
	IF(MODE.EQ.'S')GO TO 60
	IF(IQUES.EQ.2)GO TO 33
	JANS=MOD(J,12)
	NTA=NTB
	NTB=JNT(N)
35	TYPE 701,NT(K),KA
	GO TO 34
33	TYPE 700,NT(K),KA
	JANS=MOD(J,12)
34	IF(JANS.EQ.0)JANS=12
	JANS=JNT(JANS)
	GO TO 2014
60	JP=0
	CALL PLAY(NTA,0,1,JP)
	JP=0
	TYPE 53
	ACCEPT 202,X
	IF(X.EQ.'X')CALL EXIT
	IF(X.EQ.'R')GO TO 60
61	CALL PLAY(NTB,0,1,JP)
	TYPE 302
	ACCEPT 202,X
	IF(X.EQ.'X')CALL EXIT
	IF(X.EQ.'R')GO TO 2104
C  'R' REPEATS LAST ACTION.
	GO TO 100

3006	DO 40 J=1,24
	IF(NTX(J).NE.L1)GO TO 40
	L=(J+1)/2
	GO TO 42
40	CONTINUE
C  BRINGS DOWN WITHIN 12 TONES.
	DO 41 J=1,6
	IF(ISS(J).NE.L1)GO TO 41
C  LOOKS FOR DOUBLE SHARPS
	L=J*2
	IF(J.LT.4)L=L+1
	GO TO 42
41	CONTINUE
	GO TO 446
42	N=N1*2-1
	IF(N1.GT.3)N=N-1
	J=N
	IF(KA.EQ.'F')J=J-1
	IF(KA.EQ.'#')J=J+1
	N=J-L
C 1ST NOTE - 2ND NOTE
	IF(JDIR.EQ.2)N=L-J
	IF(N.LE.0)CALL PLAY(NTA,0,1,JP)
	JP=0
	TYPE 53
	ACCEPT 202,X
	IF(X.EQ.'X')CALL EXIT
	IF(X.EQ.'R')GO TO 60
61	CALL PLAY(NTB,0,1,JP)
	TYPE 302
	ACCEPT 202,X
	IF(X.EQ.'X')CALL EXIT
	IF(X.EQ.'R')GO TO 2104
C  'R' REPEATS LAST ACTION.
	GO TO 100

3006	DO 40 J=1,24
	IF(NTX(J).NE.L1)GO TO 40
	L=(J+1)/2
	GO TO 42
40	CONTINUE
C  BRINGS DOWN WITHIN 12 TONES.
	DO 41 J=1,6
	IF(ISS(J).NE.L1)GO TO 41
C  LOOKS FOR DOUBLE SHARPS
	L=J*2
	IF(J.LT.4)L=L+1
	GO TO 42
41	CONTINUE
	GO TO 446
42	N=N1*2-1
	IF(N1.GT.3)N=N-1
	J=N
	IF(KA.EQ.'F')J=J-1
	IF(KA.EQ.'#')J=J+1
	N=J-L
C 1ST NOTE - 2ND NOTE
	IF(JDIR.EQ.2)N=L-J
	IF(N.LE.0)N=N+12
	IF(MODE.EQ.'S')GO TO 60
	IF(N.NE.INTVL)GO TO 444
	GO TO 107
106	XRAN=IOK
	RAN=IERR
	K=XRAN/(XRAN+RAN)*100.
	IF(IOK.GT.5.AND.K.GE.85)TYPE 2500
C  'PRAISE' IF OVER 85% OK.
	IF(IERR.GT.5.AND.IERR.GT.IOK)TYPE 2600
C  UNDER 50%!!!!!
	TYPE 2400,IOK,K,IERR
52	FORMAT(' THIS IS ''A'' (440HZ)'/)
53	FORMAT(' PLAY?'$)
54	FORMAT(' ANSWER:'$)
300	FORMAT(A3)
301	FORMAT(' CORRECT!'/)
302	FORMAT(' TRY A NEW QUESTION'/)
400	FORMAT(' TRY AGAIN'/)
200	FORMAT(' FROM ',A1,A2,1XA4,' TO ',A1,A2,'?'/)
201	FORMAT(1XA5,A3,1XA4,' FROM ',A1,A2/)
202	FORMAT(A1,A2,4A5)
303	FORMAT(' WRONG TYPE OF ANSWER'/)
304	FORMAT(' THE ANSWER IS: ',A1,A3/)
205	FORMAT(' F=FLAT, S=SHARP, FF OR SS=DOUBLE FLAT OR SHARP'/
	1' MN=MINOR, MJ=MAJOR, P=PERFECT, DM=DIMISHED, AU=AUGMENTED'/
	1//' TYPE <R> FOR REPEAT, <Z> FOR ANSWER, <X> FOR EXIT'/
	1/' TYPE A RANDOM NUMBER'/)
255	FORMAT(' WRITE, LISTEN, SING?'/)
310	FORMAT(I)
800	FORMAT(' NOT QUITE RIGHT')
801	FORMAT(' CLEAN YOUR EARS')
802	FORMAT(' LISTEN CAREFULLY')
700	FORMAT(' THE 1ST NOTE IS ',A1,A2,' -- THE 2ND IS?'/)
701	FORMAT(' THE 2ND NOTE IS ',A1,A2,' -- THE 1ST IS?'/)
702	FORMAT(' THE INTERVAL IS?'/)
900	FORMAT(' THAT DOES NOT COMPUTE')
1300	FORMAT(' CHECK YOUR NOTES')
1100	FORMAT(' PERHAPS YOU MISUNDERSTOOD')
1200	FORMAT(' WRITE IT ON MUSIC PAPER')
1400	FORMAT(' GOOD WORK!'/)
2400	FORMAT(' YOU HAD ',I2,' CORRECT ANSWERS,',I4,'%'/I3,' ERRORS.')
2600	FORMAT(' MORE STUDY PLEASE!')
2500	FORMAT(' CONGRATULATIONS!')
	END
	SUBROUTINE PLAY(NAME,NM2,IQUES,J)
	INTEGER SOUND,SOUND2
	DIMENSION SOUND(1024),SOUND2(1024),N(3),M(3),L(3)
	EQUIVALENCE (M1,M(1)),(M2,M(2)),(M3,M(3)),(N1,N(1)),
	1 (N2,N(2)),(N3,N(3)),(L1,L(1)),(L2,L(2)),(L3,L(3))
	IF(J.EQ.-10)GO TO 3
	I=1024
	CALL GETFILE(NAME)
	CALL FASTIN(SOUND(1),1024)
	IF(IQUES.NE.4)GO TO 3

	J=RAND(0.0,700.0)
	IF(J.GT.500)J=0
	I=I+J
	CALL GETFILE(NM2)
	CALL FASTIN(SOUND2(1),1024)
	N1=0
	N2=0
	N3=0

	DO 1 K=1,I
	IF(K.LT.1025)  CALL UNPACK(SOUND(K),M)
	IF(K.GT.J)  CALL UNPACK(SOUND2(K-J),N)
	L1=(M1+N1)/2
	L2=(M2+N2)/2
	L3=(M3+N3)/2
	CALL REPACK(SOUND(K),L)
	IF(K.NE.1024)GO TO 1
	M1=0
	M2=0
	M3=0
1	CONTINUE
	J=-10
	CALL D2A(SOUND(1),I)

3	CALL D2A(SOUND(1),I)
	RETURN
	END